home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 10
/
AACD 10.iso
/
AACD
/
Utilities
/
GOCR
/
src
/
jconv.cc
next >
Wrap
C/C++ Source or Header
|
2000-05-21
|
4KB
|
112 lines
/* OCR Mai99 JS */
// PGM gray ASCII=P2 RAW=P5
// PPM RGB ASCII=P3 RAW=P6
// PBM B/W ASCII=P1 RAW=P4
// ToDo:
// - pbm-raw to pgm also for x!=0 (mod 8)
// v0.01 bug eliminated
// v0.02 convert renamed into jconv because ImageMagick uses same name
// #include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "pnm.h"
#include "pcx.h"
#include "tga.h"
int str_eq(char *s1,char *s2){
int i;
for(i=0;i<100;i++){
if(s1[i]!=s2[i]) return 0;
if(s1[i]==0) return 1;
}
return 2;
}
int test_suffix(char *nam,char *suffix){ // 1=ident 0=different
int i,j,k;
for(i=0;i<1000 && nam[i]!=0;i++); // len nam
for(j=0;j<1000 && suffix[j]!=0;j++); // len suffix
for(k=0;k<j;k++)if( nam[i-j+k]!=suffix[k] ) return 0;
return 1;
}
void help(){
printf("jconv version Mai1999 JS (pnm-raw,pcx8,tga24)\n"
"use: jconv [options] ?infile.pnm? ?outfile.pgm? ?ox? ?oy? ?dx? ?dy?\n"
"options: -shrink -pbm -? -help\n"
"example: jconv -shrink -pbm font.pbm font.pbm 0 0 0 0\n");
exit(1);
}
int main(int argn, char *argv[]){
char *inam,*onam;
pix bild;
int ox,oy,dx,dy,x,y,i,vvv=0;
// skip options
for(i=1;i<argn;i++){
if(argv[i][0]!='-') break;
if(str_eq(argv[i],"-?")) help(); else
if(str_eq(argv[i],"-help")) help(); else
if(str_eq(argv[i],"-shrink")) vvv|=2; else
if(str_eq(argv[i],"-pbm")) vvv|=4; else
printf("unknown option: %s\n",argv[i]);
}
if(argn-i!=6) help();
inam=argv[i++]; onam=argv[i++];
ox=atoi(argv[i++]); oy=atoi(argv[i++]);
dx=atoi(argv[i++]); dy=atoi(argv[i++]);
printf("# in=%s out=%s offs=%d,%d len=%d,%d vvv=%d\n",
inam,onam,ox,oy,dx,dy,vvv);
// ----- read picture
if( test_suffix(inam,".pbm") ) readpgm(inam,&bild,1); else
if( test_suffix(inam,".pgm") ) readpgm(inam,&bild,1); else
if( test_suffix(inam,".ppm") ) readpgm(inam,&bild,1); else
if( test_suffix(inam,".pnm") ) readpgm(inam,&bild,1); else
if( test_suffix(inam,".pcx") ) readpcx(inam,&bild,1); else
if( test_suffix(inam,".tga") ) readtga(inam,&bild,((vvv>1)?0:1)); else
{ printf("Error: unknown suffix"); exit(1); }
if(ox< 0 || ox>=bild.x) ox=0;
if(oy< 0 || ox>=bild.y) oy=0;
if(dx<=0 || ox+dx>bild.x) dx=bild.x-ox;
if(dy<=0 || oy+dy>bild.y) dy=bild.y-oy;
if((vvv&2)==2 && bild.bpp==1){ // -shrink
int x,y;
printf("# shrinking PGM: offs=%d,%d len=%d,%d\n",ox,oy,dx,dy);
for(y=0;y<dy;y++){ // shrink upper border
for(x=0;x<dx;x++)if(bild.p[x+ox +(y+oy)*bild.x]<127) break;
if(x<dx){ if(y>0)y--;oy+=y;dy-=y;break; } }
for(y=0;y<dy;y++){ // shrink lower border
for(x=0;x<dx;x++)if(bild.p[ox+x+(oy+dy-y-1)*bild.x]<127) break;
if(x<dx){ if(y>0)y--;dy-=y;break; } }
for(x=0;x<dx;x++){ // shrink left border
for(y=0;y<dy;y++)if(bild.p[x+ox +(y+oy)*bild.x]<127) break;
if(y<dy){ if(x>0)x--;ox+=x;dx-=x;break; } }
for(x=0;x<dx;x++){ // shrink right border
for(y=0;y<dy;y++)if(bild.p[ox+dx-x-1+(oy+y)*bild.x]<127) break;
if(y<dy){ if(x>0)x--;dx-=x;break; } }
}
printf("# final dimension: offs=%d,%d len=%d,%d bpp=%d\n",
ox,oy,dx,dy,bild.bpp);
// ---- new size
for(y=0;y<dy;y++)
for(x=0;x<dx;x++)
for(i=0;i< 3;i++)
bild.p[i+bild.bpp*(x+dx*y)]=bild.p[i+bild.bpp*(x+ox+(y+oy)*bild.x)];
bild.x=dx;
bild.y=dy;
// ---- write internal picture of textsite
printf("# write %s\n",onam);
if( test_suffix(onam,".pbm") ) writepbm(onam,bild); else
if( test_suffix(onam,".pgm") ) writepgm(onam,bild); else
if( test_suffix(onam,".ppm") ) writeppm(onam,bild); else
if( test_suffix(onam,".pnm") ) writepgm(onam,bild); else
{ printf("Error: unknown suffix"); }
delete bild.p;
}